#include "LiquidCrystal.h" // Librería para el LCD
#include "rtc.h"           // I2C para el reloj
#include "dht.h"           // Sensor de temperatura y humedad DHT21
#include "util.h"          // General purpose functions
#include "Wire.h"                // I2C para el reloj



int Vbuttons = 15;    // Lectura botones volante
int VbuttonsD = 0;    // variable para almacenar los botones en digital
bool botonLeido = true;    // Si se ha leido el botón y se puede leer otro nuevo
int botonPulsado = 6;    // Botón que ha sido pulsado


void readButtons()
// Leer botones del volante Referencia desde +12 de Vin        para +12->10k; para +5->220omn
{            
 VbuttonsD = analogRead(Vbuttons);      //leer VButtonsD
 //Serial.print("Botones(0-1023)=");     //Mostrar valor leido por serial
 Serial.println(VbuttonsD);
 Serial.println();

 if (botonLeido) {
   if((VbuttonsD>=265)&&(VbuttonsD<=370)){                //270    278 364    -
       botonPulsado = 0;
       botonLeido = false;}
   else if((VbuttonsD>=422)&&(VbuttonsD<=540)){        //427    438    535 +
           botonPulsado = 1;
           botonLeido = false;}
   else if((VbuttonsD>=560)&&(VbuttonsD<=671)){        //560    579 666    O
           botonPulsado = 2;
           botonLeido = false;}
   else if((VbuttonsD>=676)&&(VbuttonsD<=773)){        //681    698 768    >
           botonPulsado = 3;
           botonLeido = false;}
   else if((VbuttonsD>=781)&&(VbuttonsD<=863)){        //786    806 858    <
           botonPulsado = 4;
           botonLeido = false;}
   else if((VbuttonsD>=867)&&(VbuttonsD<=929)){        //872    896 924    ^
           botonPulsado = 5;
           botonLeido = false;}
   }
 printf( "boton pulsado = %d", botonPulsado);
switch(botonPulsado){                                //Comprobación botonera por serial BORRAR
   case 0:
       Serial.println("Boton -");
       break;
   case 1:
       Serial.println("Boton +");
       break;
   case 2:
       Serial.println("Boton O");
       break;
   case 3:
       Serial.println("Boton >");
       break;
   case 4:
       Serial.println("Boton <");
       break;
   case 5:
       Serial.println("Boton ^");
       break;        }
//botonLeido = true;
//botonPulsado = 6;
}

/*void toRoot() {
       setCurrent( &getRoot() );
    }*/



float vB1 = 0.0;        // Voltaje B1 real (15v máx)
float vB2 = 0.0;        // Voltaje B2 real (15v máx)
bool simbAlt = false;        // simbolo carga alternador
bool simb220 = false;        // simbolo enchufado a 220V
bool simbInv = false;        // simbolo inversor
bool simbSol = false;        // simbolo Placa solar
bool simbCal = false;        // simbolo calefacción
bool simbLuc = false;        // simbolo Luces automáticas
float aB2 = 0.0;        // Consumo B2
 



#define PinPlafon 45        // +12v del plafon
#define PinPrueba 48        // prueba de sensing 12v with arduino

void controlPantalla()
{
  Serial.println( digitalRead( PinPlafon));        // Prueba de lo que esta leyendo
  if (digitalRead( PinPrueba) == LOW){
   //lcd.display();
   /*if (borraPantalla == true){
       lcd.clear();
       borraPantalla = false;
       }*/
   lcd.display();
   analogWrite(12,50);
   Serial.println("Enciende pantalla");
   }else if (digitalRead(PinPrueba) == HIGH){
       lcd.noDisplay();
       analogWrite(12,0);
       /*borraPantalla = true;
       lcd.noDisplay();*/
       Serial.println("Apaga pantalla");
       }
}


int VB1Input = 13;    // Ref. VB1 en pin 13 analógico
int VB2Input = 14;    // Ref. VB2 en pin 14 analógico

int LEDpin = 13;        // Pin con LED conectado en placa
int RBpin = 28;          // Pin Rele Batería  (28) Poner el pin correcto!!

int PinInversor = 30;            // Pin rele inversor
int PinCierraPuertas = 38;    // Pin sw puertas
int PinAbrePuertas = 39;        // Pin sw puertas
int PinCruce = 34;
int PinNiebla    = 35;

#define DHTPIN 44     // what pin we're connected to. Se define como una constante que reemplazará los valores.
#define PinCentralita 42
#define PinShunt 12        // Referencia Shunt batería
#define PinPlafon 45        // +12v del plafon
#define PinPosicion 37    // Ref. Posición

//Caracteres para mostrar por el LCD, máximo 8
/*08 -> B01000, 15 -> B10101, 02 -> B00010, 0E -> B01110, 1F -> B11111, 0A -> B01010, 04 -> B00100,
 0B -> B01011, 01 -> B00001, 11 -> B10001, 1B -> B11011, 1D -> B11101, 17 -> B10111*/
byte chBateria1[8] = {0B01010,0B11111,0B11111,0B11111,0B00000,0B00100,0B00100,0B00000};        //bateria1
byte chBateria2[8] = {0B01010,0B11111,0B11111,0B11111,0B00000,0B01010,0B01010,0B00000};        //bateria2
byte chAlt[8] = {0B00000,0B00000,0B11111,0B00000,0B11011,0B00000,0B00000,0B00000};        // corriente continua
byte ch220[8] = {0B01000,0B10101,0B00010,0B01000,0B10101,0B00010,0B00000,0B00000};        // doble seno
byte chInv[8] = {0B11101,0B10101,0B10111,0B00000,0B11101,0B10101,0B10111,0B00000};        // CREAR
byte chSol[8] = {0B00000,0B10101,0B01110,0B11111,0B01110,0B10101,0B00000,0B00000};        // solecito
byte chCal[8] = {0B10101,0B01011,0B00001,0B10101,0B01011,0B00001,0B10101,0B01011};        // calefacción
byte chLuc[8] = {0B00000,0B01110,0B00100,0B01010,0B10001,0B01010,0B00100,0B00000};        // luces automáticas

void setup()
{
 // declaración de modo de los pines
 pinMode(VB1Input, INPUT);
 pinMode(VB2Input, INPUT);
 pinMode(Vbuttons, INPUT);
 pinMode(LEDpin, OUTPUT);
 pinMode(RBpin, OUTPUT);
 pinMode(PinInversor, OUTPUT);
 pinMode(PinCierraPuertas, OUTPUT);
 pinMode(PinAbrePuertas, OUTPUT);
 //pinMode(PinPosicion, OUTPUT);    // No hace falta, enciende posición y cruce con el mismo relé
 pinMode(PinCruce, OUTPUT);
 pinMode(PinNiebla, OUTPUT);
 //pinMode(Rx3, INPUT);
 //pinMode(Tx3, OUTPUT);
 pinMode(DHTPIN, INPUT);
 pinMode(PinCentralita, OUTPUT);
 pinMode(PinShunt, INPUT);
 pinMode(12, OUTPUT);
 pinMode(PinPlafon, INPUT);
 pinMode(PinPosicion, INPUT);
 pinMode(PinPrueba, INPUT);

 // crear caracteres
 lcd.createChar(1,chBateria1);
 lcd.createChar(2,chBateria2);
 lcd.createChar(3,chAlt);            // para usarlo, lcd.write(0);
 lcd.createChar(4,ch220);
 lcd.createChar(5,chInv);
 lcd.createChar(6,chSol);
 lcd.createChar(7,chCal);
 lcd.createChar(8,chLuc);

 Wire.begin();                            // Inicializa el I2C para el RTC
 // begin sending over serial port
 Serial.begin(9600);                    // consola serie del pc
 Serial2.begin(9600);                    // RFID
 Serial3.begin(9600);                    // Begin serial3 para Bluetooth  19200

 lcd.begin(16,2);                        // Inicializa el display
 printLCD(0);
 analogWrite(12, 255);                    // Encender led display
}




////////////////////////////////////////// INVERSOR //////////////////////////////////////

bool inversor = false;        // Estado inversor

void controlInversor()
{
 //Enciende o apaga el inversor
 if( inversor) {
   digitalWrite(PinInversor, HIGH);
   simbInv = true;
   /*delay(2000);                        // Si hace falta hacer esta operativa para que no pite el inversor habrá que gestionar una variable para que no se apague y encienda el inversor en cada interacción, como en el caso de las puertas.
   digitalWrite(PinInversor, LOW);
   delay(500);
   digitalWrite(PinInversor, HIGH);*/}
else{
   digitalWrite(PinInversor, LOW);
   simbInv = false;
}
}


#define DHTTYPE DHT22           // DHT 22  (AM2302)
DHT dht( DHTPIN, DHTTYPE);    // Crea un elemento dht del tipo y pin requeridos.

float readTemp()
{
 // Reading temperature or humidity takes about 250 milliseconds!
 // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
 float t = dht.readTemperature();
 float result;

 // check if returns are valid, if they are NaN (not a number) then something went wrong!
 if( isnan( t)) {
    Serial.println("Failed to read from DHT");
   result = 90;
 } else{
   result = t;
 }
 return result;
}  




//////////////////////////////////////////Comienzo del programa//////////////////////////////////////

int command = 0;       // This is the command char, in ascii form, sent from the serial port     

void loop(){
//lcd.begin(16,2);                        // Inicializa el display
//analogWrite(12, 255);            //0 siempre apagado -> 255 siempre encendido (led pantalla)
Serial.println("Led LCD");
//inversor =true;    //prueba

//Reloj
if (Serial.available()) {      // Look for char in serial que and process if found
   command = Serial.read();
     if (command == 84 || command == 116) {      //If command = "Tt" Set Date
      setDateDs1307();
      Serial.println( getTimeHHMM());
      Serial.println(" ");
     }
     else if (command == 82 || command == 114) {      //If command = "Rr" Read Date ... BBR
      Serial.println( getTimeHHMM());
      Serial.println(" ");
     }
     else if (command == 81 || command == 113) {      //If command = "Qq" RTC1307 Memory Functions
//       delay(100);     
       if (Serial.available()) {
        command = Serial.read();
        if (command == 49) {        //If command = "1" RTC1307 Initialize Memory - All Data will be set to
                                      // 255 (0xff).  Therefore 255 or 0 will be an invalid value.  
          Wire.beginTransmission(DS1307_I2C_ADDRESS);   // 255 will be the init value and 0 will be considered
                                                         // an error that occurs when the RTC is in Battery mode.
          Wire.write(0x08); // Set the register pointer to be just past the date/time registers.
          for( int i = 1; i <= 24; i++) {
              Wire.write(0Xff);
             //delay(10);
          }   
          Wire.endTransmission();
          Wire.beginTransmission(DS1307_I2C_ADDRESS);   
          Wire.write(0x21); // Set the register pointer to 33 for second half of registers. Only 32 writes per connection allowed.
          for( int i = 1; i <= 33; i++) {
              Wire.write(0Xff);
             //delay(10);
          }   
          Wire.endTransmission();
          getTimeHHMM();
          Serial.println(": RTC1307 Initialized Memory");
        }
        else if (command == 50) {      //If command = "2" RTC1307 Memory Dump
         getTimeHHMM();
         Serial.println(": RTC 1307 Dump Begin");
         Wire.beginTransmission( DS1307_I2C_ADDRESS);
         Wire.write( 0x00);
         Wire.endTransmission();
         Wire.requestFrom( DS1307_I2C_ADDRESS, 32);
         for( int i = 0; i <= 31; i++) {  //Register 0-31 - only 32 registers allowed per I2C connection
            int test = Wire.read();
            Serial.print( i);
            Serial.print( ": ");
            Serial.print( test, DEC);
            Serial.print( " : ");
            Serial.println( test, HEX);
         }
         Wire.beginTransmission(DS1307_I2C_ADDRESS);
         Wire.write(0x20);
         Wire.endTransmission();
         Wire.requestFrom(DS1307_I2C_ADDRESS, 32);  
         for( int i = 32; i <= 63; i++) {         //Register 32-63 - only 32 registers allowed per I2C connection
            int test = Wire.read();
            Serial.print(i);
            Serial.print(": ");
            Serial.print(test, DEC);
            Serial.print(" : ");
            Serial.println(test, HEX);
         }
         Serial.println(" RTC1307 Dump end");
        }
       }  
      }
     Serial.print("Command: ");
     Serial.println(command);     // Echo command CHAR in ascii that was sent
     }
     
     command = 0;                 // reset command
     //delay(100);
     
//RTC end      

//luces();
//baterias();


// Leer estado bluetooth

Serial.println();


// puertas();
 //controlInversor();        //Habilitar cuando este el menu funcionando


 // Actualiza estado bluetooth

 // Leer los botones
 readButtons();
 //Borrar cuando este el menu, enciende el inversor con el O (2), apaga con ^ (5)
 if ((botonLeido == false) && (botonPulsado == 2)){
   inversor = true;
   controlInversor();
   botonLeido = true;
   botonPulsado = 6;
   } else if ((botonLeido == false) && (botonPulsado == 5)){
       inversor =false;
       controlInversor();
       botonLeido = true;
       botonPulsado = 6;
       }else{
           botonLeido = true;
           botonPulsado = 6;
           }



 printLCD(0);
 controlPantalla();

 Serial.print("Pin posicion");
 Serial.println(digitalRead(PinPosicion));

 Serial.print("Pin prueba");
 Serial.println(digitalRead(PinPrueba));
// readBT();

 
 //       getDateDs1307();                //BORRAR
 //     Serial.println(" ");                //BORRAR   
//tempHumi();    
Serial.println( readTemp());  


// delay(sleep);
}
